home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / share / perl5 / DebianNet.pm next >
Text File  |  2008-11-05  |  9KB  |  284 lines

  1. # DebianNet.pm: a perl module to add entries to the /etc/inetd.conf file
  2. #
  3. # Copyright (C) 1995, 1996 Peter Tobias <tobias@et-inf.fho-emden.de>
  4. #                          Ian Jackson <iwj10@cus.cam.ac.uk>
  5. #
  6. #
  7. # DebianNet::add_service($newentry, $group);
  8. # DebianNet::disable_service($service, $pattern);
  9. # DebianNet::enable_service($service, $pattern);
  10. # DebianNet::remove_service($entry);
  11. #
  12.  
  13. package DebianNet;
  14.  
  15. require 5.000;
  16.  
  17. use Debconf::Client::ConfModule ':all';
  18.  
  19. $inetdcf="/etc/inetd.conf";
  20. $sep = "#<off># ";
  21. $version = "1.12";
  22.  
  23. sub add_service {
  24.     local($newentry, $group) = @_;
  25.     local($service, $searchentry, @inetd, $inetdconf, $found, $success);
  26.     unless (defined($newentry)) { return(-1) };
  27.     chomp($newentry);
  28.     if (defined $group) {
  29.         chomp($group);
  30.     } else {
  31.         $group = "OTHER";
  32.     }
  33.     $group =~ tr/a-z/A-Z/;
  34.     $newentry =~ s/\\t/\t/g;
  35.     ($service = $newentry) =~ s/(\W*\w+)\s+.*/$1/;
  36.     ($sservice = $service) =~ s/^#([A-Za-z].*)/$1/;
  37.     ($searchentry = $newentry) =~ s/^$sep//;
  38.     $searchentry =~ s/^#([A-Za-z].*)/$1/;
  39.  
  40.     # strip parameter from entry (e.g. -s /tftpboot)
  41.     # example:          service dgram udp     wait    root    /tcpd /prg   -s /tftpboot";
  42.     $searchentry =~ s/^(\w\S+\W+\w+\W+\w\S+\W+\w\S+\W+\w\S+\W+\S+\W+\S+).*/$1/;
  43.     $searchentry =~ s/[ \t]+/ /g;
  44.     $searchentry =~ s/ /\\s+/g;
  45.     $searchentry =~ s@\\s\+/\S+\\s\+/\S+@\\s\+\\S\+\\s\+\\S\+@g;
  46.  
  47.     if (open(INETDCONF,"$inetdcf")) {
  48.         @inetd=<INETDCONF>;
  49.         close(INETDCONF);
  50.         if (grep(m/^$sep$sservice\s+/,@inetd)) {
  51.             &enable_service($sservice);
  52.         } else {
  53.             if (grep(m/^$sservice\s+/,@inetd)) {
  54.                 if (grep(m/^$sservice\s+/,@inetd) > 1) {
  55.             set("update-inetd/ask-several-entries", "true");
  56.             fset("update-inetd/ask-several-entries", "seen", "false");
  57.             settitle("update-inetd/title");
  58.             subst("update-inetd/ask-several-entries", "service", "$sservice");
  59.             subst("update-inetd/ask-several-entries", "sservice", "$sservice");
  60.             subst("update-inetd/ask-several-entries", "inetdcf", "$inetdcf");
  61.             input("high", "update-inetd/ask-several-entries");
  62.             @ret = go();
  63.             if ($ret[0] == 0) {
  64.                 @ret = get("update-inetd/ask-several-entries");
  65.             exit(1) if ($ret[1] !~ m/true/i);
  66.             }
  67.                 } elsif (!grep(m:^#?.*$searchentry.*:, @inetd)) {
  68.             set("update-inetd/ask-entry-present", "true");
  69.             fset("update-inetd/ask-entry-present", "seen", "false");
  70.             settitle("update-inetd/title");
  71.             subst("update-inetd/ask-entry-present", "service", "$sservice");
  72.             subst("update-inetd/ask-entry-present", "newentry", "$newentry");
  73.             subst("update-inetd/ask-entry-present", "sservice", "$sservice");
  74.             subst("update-inetd/ask-entry-present", "inetdcf", "$inetdcf");
  75.             my $lookslike = (grep(m/^$sservice\s+/,@inetd))[0];
  76.             $lookslike =~ s/\n//g;
  77.             subst("update-inetd/ask-entry-present", "lookslike", "$lookslike");
  78.             input("high", "update-inetd/ask-entry-present");
  79.             @ret = go();
  80.             if ($ret[0] == 0) {
  81.                 @ret = get("update-inetd/ask-entry-present");
  82.             exit(1) if ($ret[1] !~ m/true/i);
  83.             }
  84.                 }
  85.             } elsif (grep(m/^#\s*$sservice\s+/, @inetd) >= 1 or
  86.               (($service =~ s/^#//) and grep(m/^$service\s+/, @inetd)>=1)) {
  87.                 &printv("Processing service \`$service' ... not changed\n");
  88.             } else {
  89.                 &printv("Processing service \`$sservice' ... added\n");
  90.                 $inetdconf=1;
  91.             }
  92.         }
  93.         if ($inetdconf) {
  94.             open(ICWRITE, ">$inetdcf.new") || die "Error creating new $inetdcf: $!\n";
  95.             open(ICREAD, "$inetdcf");
  96.             while(<ICREAD>) {
  97.                 chomp;
  98.                 if (/^#:$group:/) {
  99.                     $found = 1;
  100.                 };
  101.                 if ($found and !(/[a-zA-Z#]/)) {
  102.                     print (ICWRITE "$newentry\n") || die "Error writing new $inetdcf: $!\n";
  103.                     $found = 0;
  104.                     $success = 1;
  105.                 }
  106.                 print ICWRITE "$_\n";
  107.             }
  108.             close(ICREAD);
  109.             unless ($success) {
  110.                 print (ICWRITE "$newentry\n") || die "Error writing new $inetdcf: $!\n";
  111.             }
  112.             close(ICWRITE) || die "Error closing new inetd.conf: $!\n";
  113.  
  114.             rename("$inetdcf.new","$inetdcf") ||
  115.                 die "Error installing new $inetdcf: $!\n";
  116.             chmod(0644, "$inetdcf");
  117.  
  118.             &wakeup_inetd;
  119.         }
  120.     }
  121.  
  122.     return(1);
  123. }
  124.  
  125. sub remove_service {
  126.     my($service) = @_;
  127.     unless(defined($service)) { return(-1) };
  128.     chomp($service);
  129.     if($service eq "") {
  130.          print STDERR "DebianNet::remove_service called with empty argument\n";
  131.          return(-1);
  132.     }
  133.  
  134.     if ((&scan_entries("$service") > 1) and (not defined($multi))) {
  135.     set("update-inetd/ask-remove-entries", "false");
  136.     fset("update-inetd/ask-remove-entries", "seen", "false");
  137.         settitle("update-inetd/title");
  138.     subst("update-inetd/ask-remove-entries", "service", "$service");
  139.     subst("update-inetd/ask-remove-entries", "inetdcf", "$inetdcf");
  140.     input("high", "update-inetd/ask-remove-entries");
  141.     @ret = go();
  142.     if ($ret[0] == 0) {
  143.         @ret = get("update-inetd/ask-remove-entries");
  144.         return(1) if ($ret[1] =~ /false/i);
  145.         }
  146.     }
  147.  
  148.     open(ICWRITE, ">$inetdcf.new") || die "Error creating $inetdcf.new";
  149.     open(ICREAD, "$inetdcf");
  150.     RLOOP: while(<ICREAD>) {
  151.         chomp;
  152.         unless (/^$service\s+/) {
  153.             print ICWRITE "$_\n";
  154.         } else {
  155.             &printv("Removing line: \`$_'\n");
  156.         }
  157.     }
  158.     close(ICREAD);
  159.     close(ICWRITE);
  160.  
  161.     rename("$inetdcf.new", "$inetdcf") ||
  162.         die "Error installing new $inetdcf: $!\n";
  163.     chmod(0644, "$inetdcf");
  164.  
  165.     wakeup_inetd(1);
  166.     return(1);
  167. }
  168.  
  169. sub disable_service {
  170.     my($service, $pattern) = @_;
  171.     unless (defined($service)) { return(-1) };
  172.     unless (defined($pattern)) { $pattern = ''; }
  173.     chomp($service);
  174.  
  175.     if ((&scan_entries("$service", $pattern) > 1) and (not defined($multi))) {
  176.     set("update-inetd/ask-disable-entries", "false");
  177.     fset("update-inetd/ask-disable-entries", "seen", "false");
  178.         settitle("update-inetd/title");
  179.     subst("update-inetd/ask-disable-entries", "service", "$service");
  180.     subst("update-inetd/ask-disable-entries", "inetdcf", "$inetdcf");
  181.     input("high", "update-inetd/ask-disable-entries");
  182.     @ret = go();
  183.     if ($ret[0] == 0) {
  184.         @ret = get("update-inetd/ask-disable-entries");
  185.         return(1) if ($ret[1] =~ /false/i);
  186.         }
  187.     }
  188.  
  189.     open(ICWRITE, ">$inetdcf.new") || die "Error creating new $inetdcf: $!\n";
  190.     open(ICREAD, "$inetdcf");
  191.     DLOOP: while(<ICREAD>) {
  192.       chomp;
  193.       if (/^$service\s+\w+\s+/ and /$pattern/) {
  194.           &printv("Processing service \`$service' ... disabled\n");
  195.           $_ =~ s/^(.+)$/$sep$1/;
  196.       }
  197.       print ICWRITE "$_\n";
  198.     }
  199.     close(ICREAD);
  200.     close(ICWRITE) || die "Error closing new inetd.conf: $!\n";
  201.  
  202.     rename("$inetdcf.new","$inetdcf") ||
  203.         die "Error installing new $inetdcf: $!\n";
  204.     chmod(0644, "$inetdcf");
  205.  
  206.     wakeup_inetd(1);
  207.     return(1);
  208. }
  209.  
  210. sub enable_service {
  211.     my($service, $pattern) = @_;
  212.     unless (defined($service)) { return(-1) };
  213.     unless (defined($pattern)) { $pattern = ''; }
  214.     chomp($service);
  215.     open(ICWRITE, ">$inetdcf.new") || die "Error creating new $inetdcf: $!\n";
  216.     open(ICREAD, "$inetdcf");
  217.     while(<ICREAD>) {
  218.       chomp;
  219.       if (/^$sep$service\s+\w+\s+/ and /$pattern/) {
  220.           &printv("Processing service \`$service' ... enabled\n");
  221.           $_ =~ s/^$sep//;
  222.       }
  223.       print ICWRITE "$_\n";
  224.     }
  225.     close(ICREAD);
  226.     close(ICWRITE) || die "Error closing new inetd.conf: $!\n";
  227.  
  228.     rename("$inetdcf.new","$inetdcf") ||
  229.         die "Error installing new $inetdcf: $!\n";
  230.     chmod(0644, "$inetdcf");
  231.  
  232.     &wakeup_inetd;
  233.     return(1);
  234. }
  235.  
  236. sub wakeup_inetd {
  237.     my($removal) = @_;
  238.     my($pid);
  239.     my($action);
  240.  
  241.     if ($removal) {
  242.         $action = 'force-reload';
  243.     } else {
  244.         $action = 'restart';
  245.     }
  246.  
  247.     if (open(P,"/var/run/inetd.pid")) {
  248.         $pid=<P>;
  249.         if (open(C,sprintf("/proc/%d/stat",$pid))) {
  250.             $_=<C>;
  251.             if (m/^\d+ \(inetd\)/) { kill(1,$pid); }
  252.             close(C);
  253.         }
  254.         close(P);
  255.     } else {
  256.         $_ = glob "/etc/init.d/*inetd";
  257.         if (m/\/etc\/init\.d\/(.*inetd)/) {
  258.             my $service = $1;
  259.             system("invoke-rc.d $service $action >/dev/null");
  260.         }
  261.     }
  262.     return(1);
  263. }
  264.  
  265. sub scan_entries {
  266.     my ($service, $pattern) = @_;
  267.     unless (defined($pattern)) { $pattern = ''; }
  268.     my $counter = 0;
  269.  
  270.     open(ICREAD, "$inetdcf");
  271.     SLOOP: while (<ICREAD>) {
  272.         $counter++ if (/^$service\s+/ and /$pattern/);
  273.     }
  274.     close(ICREAD);
  275.     return($counter);
  276. }
  277.  
  278. sub printv {
  279.     print STDERR @_ if (defined($verbose));
  280. }
  281.  
  282. 1;
  283.  
  284.